#include <iostream>
#include <vector>
using namespace std;

void VectorApiTest()
{
    // vector的数据结构我还没看，注意！

    // 初始化 vector 的不同方式,由此可知，vector支持重载初始化
    std::vector<int> myVector;     // 创建一个存储整数的空 vector
    std::vector<int> myVector1(5); // 创建一个包含 5 个整数的 vector，每个值都为默认值（0）
    vector<int> myVector2(5, 10);  // 创建一个包含 5 个整数的 vector，每个值都为 10

    // 插入vector尾部
    // 添加的是第一个初始化的值
    myVector.push_back(1); // 将整数 7 添加到 vector 的末尾
    myVector.push_back(2);
    myVector1.push_back(1);
    myVector1.push_back(2);
    myVector2.push_back(1);
    myVector2.push_back(2);

    // 访问元素--通过下标来访问--与数组一致
    // 注意：vector 不支持负索引，即 myVector[-1] 是无效的
    // 注意：vector 不支持越界访问，即 myVector[10] 是无效的
    int x = myVector[0];      // 获取第一个元素
    int y = myVector.at(1);   // 获取第二个元素
    int x1 = myVector1[0];    // 获取第一个元素
    int y1 = myVector1.at(1); // 获取第二个元素
    int x2 = myVector2[0];    // 获取第一个元素
    int y2 = myVector2.at(1); // 获取第二个元素

    // 获取vector大小
    int size = myVector.size(); // 获取 vector 中的元素数量
    int size1 = myVector1.size();
    int size2 = myVector2.size();

    // 迭代vector,由于size（）代表其长度
    for (int i = 0; i < myVector.size(); i++)
    {
        std::cout << myVector[i] << " "; // 输出 vector 中的元素
    }
    std::cout << std::endl;
    for (int i = 0; i < myVector1.size(); i++)
    {
        std::cout << myVector1[i] << " "; // 输出 vector 中的元素
    }
    std::cout << std::endl;
    for (int i = 0; i < myVector2.size(); i++)
    {
        std::cout << myVector2[i] << " "; // 输出 vector 中的元素
    }

    // vector的动态扩容机制
    // 当 vector 中的元素数量超过其容量时，vector 会自动重新分配更大的内存空间来存储元素。
    // 这种机制使得 vector 可以动态地调整大小，而不需要手动管理内存。扩容倍数为2倍
    // 注意：vector 的动态扩容机制可能会导致性能下降，特别是当 vector 中的元素数量很大时。
    // 因此，在使用 vector 时，应该尽量避免频繁的插入和删除操作，以避免性能问题。
    // 可以使用 reserve() 函数来预先分配内存空间，以避免频繁的扩容操作。
    // 可以使用 shrink_to_fit() 函数来释放未使用的内存空间，以减少内存占用。
    // 写出vector的扩容机制的代码，当vector的size等于capacity时，vector会重新分配内存空间，指针重新指向新的内存空间
}
void VectorApiTest2()
{
    // 使用构造函数初始化vector
    std::vector<int> myVector = {1, 2, 3, 4, 5};
    // 使用深拷贝构造函数
    std::vector<int> myVector1;
    // assign()函数的作用是将一个vector的内容赋值给另一个vector，属于深拷贝
    myVector1.assign(myVector.begin(), myVector.end());
    for (int i = 0; i < myVector1.size(); i++)
    {
        std::cout << myVector1[i];
    }
    std::cout << std::endl;
    for (int i = 0; i < myVector.size(); i++)
    {
        std::cout << myVector[i];
    }
}
void VectorApiTest3()
{
    // 调用vector类内置函数
    std::vector<int> myVector = {1, 2, 3, 4, 5};
}

int main(int argc, char const *argv[])
{

    VectorApiTest(); // 创建对象，调用构造函数，初始化对象，调用析构函数，销毁对象
    std::cout << std::endl;
    VectorApiTest2(); // 深拷贝对象

       return 0;
}
